# -*- coding: utf-8 -*-
'''
@文件    :register.py
@说明    :注册器
@时间    :2025/08/08 00:58:34
@作者    :浪晋
@版本    :1.0
'''
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.openapi.docs import (
    get_redoc_html,
    get_swagger_ui_html,
    get_swagger_ui_oauth2_redirect_html
)
from fastapi.exceptions import (
    RequestValidationError, 
    ResponseValidationError
)
from starlette.exceptions import HTTPException
from app.core.middlewares import HttpLogMiddleware
from app.core.exceptions import (
    validate_request_handler,
    http_exception_handler,
    validate_response_handler,
    internal_exception_handler
)
from app.settings.config import config


def app_middlewares(app: FastAPI):
    """
    @功能    :中间件注册器
    @参数    :
    @返回值  :
    @时间    :2024/10/26 00:27:43
    @作者    :浪晋
    @版本    :1.0
    """
    app.add_middleware(HttpLogMiddleware)


def app_exceptions(app: FastAPI):
    """
    @功能    :异常注册器
    @参数    :
    @返回值  :
    @时间    :2024/10/18 17:05:35
    @作者    :浪晋
    @版本    :1.0
    """
    app.add_exception_handler(HTTPException, http_exception_handler)
    app.add_exception_handler(RequestValidationError, validate_request_handler)
    app.add_exception_handler(ResponseValidationError, validate_response_handler)
    # app.add_exception_handler(Exception, internal_exception_handler)


def api_routers(app: FastAPI, prefix="/api"):
    """
    @功能    :路由注册器
    @参数    :
    @返回值  :
    @时间    :2024/10/26 00:27:43
    @作者    :浪晋
    @版本    :1.0
    """
    from app import api

    app.include_router(api.router, prefix=prefix)


def file_mounts(app: FastAPI):
    """
    @功能    :文件挂载注册器
    @参数    :
    @返回值  :
    @时间    :2025/02/13 18:00:51
    @作者    :浪晋
    @版本    :1.0
    """
    app.mount(
        path=config.STATIC_URL, 
        app=StaticFiles(directory=config.STATIC_PATH), 
        name=config.STATIC_NAME
    )


def api_docs(app: FastAPI) -> None:
    """
    @功能    :接口文档注册器
    @参数    :
    @返回值  :
    @时间    :2025/08/08 01:09:14
    @作者    :浪晋
    @版本    :1.0
    """

    @app.get("/docs", include_in_schema=False)
    async def custom_swagger_ui_html():
        return get_swagger_ui_html(
            openapi_url=app.root_path + app.openapi_url,
            title=app.title + " - Swagger UI",
            oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url,
            swagger_js_url=config.SWAGGER_JS_URL,
            swagger_css_url=config.SWAGGER_CSS_URL,
            swagger_favicon_url=config.FAVICON_URL
        )

    @app.get(app.swagger_ui_oauth2_redirect_url, include_in_schema=False)
    async def swagger_ui_redirect():
        return get_swagger_ui_oauth2_redirect_html()

    @app.get("/redoc", include_in_schema=False)
    async def custom_redoc_html():
        return get_redoc_html(
            openapi_url=app.root_path + app.openapi_url,
            title=app.title + " - ReDoc",
            redoc_js_url=config.REDOC_JS_URL,
            redoc_favicon_url=config.FAVICON_URL
        )